﻿@{
    Page.Title = "계정 만들기";

    if (IsPost) {
        var name = Request["name"];
        if (name.IsEmpty()) {
            ModelState.AddError("name", "표시 이름을 지정해야 합니다.");
        }

        var email = Request["email"];
        if (email.IsEmpty()) {
            ModelState.AddError("email", "전자 메일 주소를 지정해야 합니다.");
        }

        var timeZoneId = Request["timezone"];

        if (timeZoneId.IsEmpty()) {
            ModelState.AddError("timezone", "표준 시간대를 지정해야 합니다.");
        }

        // 표준 시간대가 목록에 있는 경우에만 허용
        try {
            TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
        } catch {
            ModelState.AddError("timezone", "올바른 표준 시간대를 지정해야 합니다.");
        }

        var password = Request["password"];
        var confirmPassword = Request["confirmPassword"];

        if (password.IsEmpty()) {
            ModelState.AddError("password", "암호를 지정해야 합니다.");
        }

        if (confirmPassword.IsEmpty()) {
            ModelState.AddError("confirmPassword", "암호 확인을 입력해야 합니다.");
        }

        if (password != confirmPassword) {
            ModelState.AddFormError("새 암호와 암호 확인이 일치하지 않습니다.");
        }

        if (ModelState.IsValid) {
            if (UserHelper.UserExists(email)) {
                ModelState.AddFormError("전자 메일 주소가 이미 사용 중입니다.");
            } else {
                // 트랜잭션에서 이 내용 및 try catch의 내용이 수행되어야 할 것
                // 같습니다. 사용자를 추가하는데 멤버 자격에 문제가 있다면
                // 어떻게 될까요?
                var userId = UserHelper.AddUser(name, email, timeZoneId);

                Calendar.CreateCalendar(userId);

                // 멤버 자격 데이터베이스에서 새 항목을 만들어 연결합니다.
                // 성공한 경우 계속해서 요청을 처리합니다.
                try {
                    WebSecurity.CreateAccount(email, password);
                    WebSecurity.Login(email, password);
                    // 여기에 "등록 환영" 페이지가
                    // 있어야 할 것 같습니다.

                    Response.Redirect("~/");
                } catch (System.Web.Security.MembershipCreateUserException e) {
                    ModelState.AddFormError(e.ToString());
                }
            }
        }
    }
}
<p>
    새 계정을 만들려면 아래 폼을 사용하십시오. 
</p>
@Html.ValidationSummary()
<form method="post" action="" id="accountForm">
    <div>
        <table>
            <tr>
                <td><label for="name">표시 이름</label></td>
                <td>
                    @Html.TextBox("name")
                </td>
            </tr>
            <tr>
                <td><label for="email">전자 메일</label></td>
                <td>
                    @Html.TextBox("email")
                </td>
            </tr>
            <tr>
                <td><label for="timezone">표준 시간대</label></td>
                <td>
                    <select id="timezone" name="timezone">
                        @foreach (var timeZone in TimeZoneInfo.GetSystemTimeZones()) {
                            <option value="@timeZone.Id">@timeZone.DisplayName</option>
                        }
                    </select>
                </td>
            </tr>
            <tr>
                <td><label for="password">암호</label></td>
                <td>
                    @Html.Password("password")
                </td>
            </tr>
            <tr>
                <td><label for="confirmPassword">암호 확인</label></td>
                <td>
                    @Html.Password("confirmPassword")
                </td>
            </tr>
            <tr>
                <td colspan="2" id="submit"><input type="submit" value="등록" /></td>
            </tr>
        </table>
    </div>
</form>